package controllers

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"lottery/comm"
	"lottery/conf"
	"lottery/models"
	"lottery/utils"
	"strconv"
	"time"
)

// 封装实现对 用户今日参与次数的验证
// 这属于验证的功能，对部分逻辑的封装， 我们开辟一个新的文件来编写， 采用小写名即可
func (idx *IndexController) checkUserday(c *gin.Context, uid int, userDayNum int64) bool {
	// 读取用户的数据
	userDayInfo := idx.ServiceUserday.GetUserToday(uid)
	if userDayInfo != nil && userDayInfo.Uid == uid {
		// 今天存在抽奖记录
		if userDayInfo.Num >= conf.UserPrizeMax {
			// 对比结果，如果数据库中的记录数大于当前的缓存中的记录数，重新初始化缓存
			if int(userDayNum) < userDayInfo.Num {
				utils.InitUserLuckyNum(uid, int64(userDayInfo.Num))
			}
			return false
		} else {
			// 抽奖次数递增： 这里不用考虑到原子操作，因为2.中分布式锁限制，与用户相关的都只能一步步来
			userDayInfo.Num++
			// 还需要更新时间
			userDayInfo.SysUpdated = comm.NowUnix()
			// 对比结果，如果数据库中的记录数大于当前的缓存中的记录数，重新初始化缓存
			if int(userDayNum) < userDayInfo.Num {
				utils.InitUserLuckyNum(uid, int64(userDayInfo.Num))
			}
			// 更新到数据库里
			err := idx.ServiceUserday.Update(userDayInfo, nil) // 只要字段不为空，就能更新到数据库
			if err != nil {
				// 记录下日志
				log.Println("index_lucky_check_userday ServiceUserDay.Update "+
					"err = ", err)
			}
		}
	} else { // 今天是第一次参加抽奖活动
		// 1. 创建今天的用户参与记录
		y, m, d := time.Now().Date()
		strDay := fmt.Sprintf("%d%02d%02d", y, m, d)
		day, _ := strconv.Atoi(strDay)
		userDayInfo = &models.LtUserday{
			Uid:        uid,
			Day:        day,
			Num:        1,
			SysCreated: comm.NowUnix(),
		}
		err := idx.ServiceUserday.Create(userDayInfo)
		// 记录下日志
		if err != nil {
			log.Println("index_lucky_3check_userday ServiceUserDay.Create "+
				"err = ", err)
		}
		// 同样需要对数据进行初始化处理
		utils.InitUserLuckyNum(uid, 1)
	}
	return true
}
